#Исследование базы данных о глобальном терроризме:

##Цели исследования: На заметку: сделать по график стран мира и числа терактов в них

Разобьём задачи на подзадачи: Интересующие подзадачи: Страны: Число преступлений в странах/их процентное соотношение Характер преступления в каждой стране Преступления: Характер и успешность преступления Зависимость преступления от страны Характер суицидальных атак Даты: Криминальные годы Продолжительные преступления Локация: Поквадратное исследование

Важное замечание: База данных образована таким образом, что некоторые столбцы пусты или неправильно заполнены вплоть до 1997-го года

library("tidyverse")
## Warning: пакет 'tidyverse' был собран под R версии 4.2.3
## Warning: пакет 'ggplot2' был собран под R версии 4.2.3
## Warning: пакет 'tibble' был собран под R версии 4.2.3
## Warning: пакет 'tidyr' был собран под R версии 4.2.3
## Warning: пакет 'readr' был собран под R версии 4.2.3
## Warning: пакет 'purrr' был собран под R версии 4.2.3
## Warning: пакет 'dplyr' был собран под R версии 4.2.3
## Warning: пакет 'stringr' был собран под R версии 4.2.3
## Warning: пакет 'forcats' был собран под R версии 4.2.3
## Warning: пакет 'lubridate' был собран под R версии 4.2.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.3     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.4     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.0
## ✔ purrr     1.0.1     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library("ggplot2")
library("gganimate")
## Warning: пакет 'gganimate' был собран под R версии 4.2.3
library("rworldmap")
## Warning: пакет 'rworldmap' был собран под R версии 4.2.3
## Загрузка требуемого пакета: sp
## Warning: пакет 'sp' был собран под R версии 4.2.3
## ### Welcome to rworldmap ###
## For a short introduction type :   vignette('rworldmap')
library("leaflet")
## Warning: пакет 'leaflet' был собран под R версии 4.2.3
GT <- read.csv("globalterrorism.csv")

Наблюдение 1: Не все даты соответствуют описанию из Codebook’а. Так eventid состоит из 12 цифр. Первые 8 — год (4 цифры), месяц (2 цифры)и день (2 цифры); последние 4 — порядковый номер для даты. При этом существуют несоответствия между датами и eventid и есть нулевой месяц и нулевой день (?) В целях экономии сил и времени будет пользоваться исходными данными.

Ошибочное наблюдение: в Codebook указано, что 0 - неопределённая дата

GT <- GT|>
  mutate(year = as.integer(str_sub(eventid, start=1, end=4)),
         month = as.integer(str_sub(eventid, start=5, end=6)),
         day = as.integer(str_sub(eventid, start=7,end=8)),
         .after=eventid)
GT <- GT|>
  mutate(date=as.Date(with(GT, paste(year, month, day, sep="-")), "%Y-%m-%d"),
         .after=day)|>
  mutate(idate=as.Date(with(GT, paste(iyear, imonth, iday, sep="-")), "%Y-%m-%d"),
         .after=iday)
dateValidator <- if_else(GT$date == GT$idate, T, F, NA)
length(dateValidator)
## [1] 181691
length(dateValidator[dateValidator == T])
## [1] 176727
length(dateValidator[dateValidator == F])
## [1] 5870
length(dateValidator[is.na(dateValidator)])
## [1] 906

Конец наблюдения 1.

Наблюдения 2: Даты

GTO <- GT|>
  select(!c(year, month, day, date))

Год

GTOY <- GTO|>
  group_by(iyear)|>
  summarize(yearNum = n())

rmarkdown::paged_table(GTOY|>arrange(desc(iyear)))
plot(GTOY$iyear, GTOY$yearNum, type="l",
     xlab = "Year", ylab = "Number of Crimes")

summary(GTOY$yearNum)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     471    1364    2870    3866    4504   16903

Месяц

GTOY <- GTO|>
  group_by(imonth)|>
  summarize(monthNum = n())
barplot(height = GTOY$monthNum, 
        names.arg=GTOY$imonth,
        xlab = "Month",
        ylab = "Number of Crimes")

summary(GTOY$monthNum)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##      20   14180   15152   13976   15563   16875

День

GTOY <- GTO|>
  group_by(iday)|>
  summarize(dayNum = n())

barplot(GTOY$dayNum, 
        names.arg=GTOY$iday,
        xlab = "Day",
        ylab = "Number of Crimes")

summary(GTOY$dayNum)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     891    5817    5933    5678    6027    6500

Проверял, есть ли строки, в которых idate = NA и extended = 1 (событие длится более 24 часов). Обоснование: хотим проверить, есть ли в датасете данные, для которых неизвестно, когда они начались, но известно, что они длились более 24 часов. Из того, что была выдан пустой data.frame следует, что таких строк нет.

GTO|>
  select(idate, extended)|>
  filter(is.na(idate) && extended == 1)|>
  rmarkdown::paged_table()
## Warning: There was 1 warning in `filter()`.
## ℹ In argument: `is.na(idate) && extended == 1`.
## Caused by warning in `is.na(idate) && extended == 1`:
## ! 'length(x) = 181691 > 1' перекодирован в 'logical(1)'

Длительность Для всех случаев, когда точная дата неизвестна, длительность события < 24 часов (одного дня)

Выводы: Присутствуют даты для которых extended = 1, но resolution = NA; Имеются данные с отрицательными временными промежутками (Ошибочные данные или запоздалое событие?) Самое длинное событие длилось 7324 дня (к сожалению, опечатка в базе данных)(индекс 4808).

GTD <- GTO|>
  select(eventid,idate, extended, resolution)|>
  group_by(idate)|>
  mutate(resNum=as.numeric(as.Date(resolution, format="%m/%d/%Y")),
         idateNum=as.numeric(idate))|>
  # mutate(resolution=ifelse(is.na(resolution),0,resolution),
  #        idateNum=ifelse(is.na(idate),0,idateNum))|>
  mutate(duration = ifelse(extended==0,0, resNum-idateNum))|>group_by(duration)
rmarkdown::paged_table(GTD|>summarize(durationNum=n())|>
                         arrange(desc(durationNum)))

Заодно проверили, что не обязательно чем больше событий, тем меньше длительность.

Страны: Исходя из карты, можно увидеть, какие страны и в каком числе имеют теракты

library("rworldmap")
GTV <- GTO|>
  select(country_txt)|>
  group_by(country_txt)|>
  summarize(country_terror_num=n(), country_terror_per=100*n()/nrow(GTO))|>
  arrange(desc(country_terror_num))
spdf<-joinCountryData2Map(GTV, joinCode = "NAME", nameJoinColumn = "country_txt", verbose = T)
## 187 codes from your data successfully matched countries in the map
## 18 codes from your data failed to match with a country code in the map
##       failedCodes failedCountries                 
##  [1,] NA          "West Bank and Gaza Strip"      
##  [2,] NA          "West Germany (FRG)"            
##  [3,] NA          "Yugoslavia"                    
##  [4,] NA          "Rhodesia"                      
##  [5,] ""          "Soviet Union"                  
##  [6,] "GLP"       "Guadeloupe"                    
##  [7,] NA          "Zaire"                         
##  [8,] NA          "East Germany (GDR)"            
##  [9,] "MTQ"       "Martinique"                    
## [10,] NA          "Serbia-Montenegro"             
## [11,] NA          "Czechoslovakia"                
## [12,] NA          "North Yemen"                   
## [13,] NA          "People's Republic of the Congo"
## [14,] NA          "South Yemen"                   
## [15,] NA          "Falkland Islands"              
## [16,] NA          "International"                 
## [17,] NA          "New Hebrides"                  
## [18,] NA          "South Vietnam"                 
## 56 codes from the map weren't represented in your data
mapCountryData(spdf, nameColumnToPlot="country_terror_num",catMethod="fixedWidth",
               missingCountryCol=gray(.8),colourPalette = "topo",mapRegion="world")

rmarkdown::paged_table(GTV|>arrange(desc(country_terror_num)))
barplot(GTV$country_terror_num, names.arg=GTV$country_txt, col = rainbow(100))

Как изменится карта, если выбросить топ 5?

library("rworldmap")
GTVn <- GTO|>
  select(country_txt)|>
  group_by(country_txt)|>
  summarize(country_terror_num=n())|>
  arrange(desc(country_terror_num))|>
  slice(6:n())
spdf<-joinCountryData2Map(GTVn, joinCode = "NAME", nameJoinColumn = "country_txt", verbose = T)
## 182 codes from your data successfully matched countries in the map
## 18 codes from your data failed to match with a country code in the map
##       failedCodes failedCountries                 
##  [1,] NA          "West Bank and Gaza Strip"      
##  [2,] NA          "West Germany (FRG)"            
##  [3,] NA          "Yugoslavia"                    
##  [4,] NA          "Rhodesia"                      
##  [5,] ""          "Soviet Union"                  
##  [6,] "GLP"       "Guadeloupe"                    
##  [7,] NA          "Zaire"                         
##  [8,] NA          "East Germany (GDR)"            
##  [9,] "MTQ"       "Martinique"                    
## [10,] NA          "Serbia-Montenegro"             
## [11,] NA          "Czechoslovakia"                
## [12,] NA          "North Yemen"                   
## [13,] NA          "People's Republic of the Congo"
## [14,] NA          "South Yemen"                   
## [15,] NA          "Falkland Islands"              
## [16,] NA          "International"                 
## [17,] NA          "New Hebrides"                  
## [18,] NA          "South Vietnam"                 
## 61 codes from the map weren't represented in your data
mapCountryData(spdf, nameColumnToPlot="country_terror_num",catMethod="fixedWidth",
               missingCountryCol=gray(.8),colourPalette = "topo",mapRegion="world")

rmarkdown::paged_table(GTVn|>arrange(desc(country_terror_num)))
barplot(GTVn$country_terror_num, names.arg=GTVn$country_txt, col = rainbow(100))

Видим, что не во всех странах были установлены преступления/теракты. Возможно их и не было. В любом случае, предоставим список стран, которые выделены серым на карте.

countries <- getMap()
countries <- countries$NAME[!(countries$NAME%in%GTV$country_txt)]|>
  as.data.frame()
rmarkdown::paged_table(countries)

Формы терроризма:

library("grid")
library("gridBase")
## Warning: пакет 'gridBase' был собран под R версии 4.2.3
GTD <- GTO|>
  select(eventid,doubtterr, alternative_txt, attacktype1_txt, attacktype2_txt,
         attacktype3_txt)|>
  mutate(alternative_txt = ifelse(doubtterr==0, "Terrorism", alternative_txt))|>
  mutate(alternative_txt = ifelse(doubtterr==-9, "Not Included", alternative_txt))

GTDdterr <- GTD|>group_by(alternative_txt)|>
  summarize(terrtype_num = n(), terrtype_per = 100*n()/nrow(GTO))|>arrange(desc(terrtype_num))
rmarkdown::paged_table(GTDdterr)
b <- barplot(GTDdterr$terrtype_num, col=rainbow(50))
vps<-baseViewports()
pushViewport(vps$inner, vps$figure, vps$plot)

grid.text(GTDdterr$alternative_txt,
          x=unit(b, "native"), y=unit(-1,"lines"),
          just="right",rot=50, gp=gpar(fontsize=7, col=rainbow(50)))
popViewport(3)
text(b, GTDdterr$terrtype_num[1], labels=GTDdterr$terrtype_num, pos=1)

region:

GTO|>
  group_by(country_txt, region_txt, provstate, city)|>
  summarize(terr_num = n(), terr_per=100*n()/nrow(GTO))|>
  arrange(desc(terr_num))|>
  rmarkdown::paged_table()
## `summarise()` has grouped output by 'country_txt', 'region_txt', 'provstate'.
## You can override using the `.groups` argument.
GTO|>
  filter(country_txt == "Iraq", city == "Baghdad")|>
  group_by(iyear, imonth, iday)|>
  summarize()|>
  arrange(iyear, imonth, iday)|>
  as.data.frame()|>
  rmarkdown::paged_table()
## `summarise()` has grouped output by 'iyear', 'imonth'. You can override using
## the `.groups` argument.

Первый записанный теракт в Багдаде берёт своё начало с 15-го декабря 1976-го, а заканчивается 30-ым декабрём 2017-го. Суммарно 14990 дней между этими датами. Учитывая то, что в Багдаде за это время произошло 7585, то, в среднем

14990/7585
## [1] 1.976269

Почти каждые 2 дня в Багдаде происходил какой-то теракт или преступление.

GTD <- GTO|>filter(country_txt=="Iraq", city=="Baghdad")|>
  group_by(iyear)|>
  summarize(num = n(), per=100*n()/nrow(GTO|>filter(country_txt=="Iraq", city=="Baghdad")))|>
  arrange(iyear)

rmarkdown::paged_table(GTD)
plot(GTD$iyear, GTD$num, type="l",
     xlab="Year", ylab="Number of Crimes", main="Crimes/Terracts in Baghdad (1976-2017)")+ grid(lty=1)

## integer(0)

target/natlty:

GTO|>group_by(target1, natlty1_txt, target2, natlty2_txt, target3, natlty3_txt)|>
  summarize(targ_num=n(),targ_per=100*n()/nrow(GTO))|>
  arrange(desc(targ_num))|>
  rmarkdown::paged_table()
## `summarise()` has grouped output by 'target1', 'natlty1_txt', 'target2',
## 'natlty2_txt', 'target3'. You can override using the `.groups` argument.

perpetrator group:

GTO|>group_by(gname,gsubname,guncertain1, gname2,gsubname2,guncertain2,
              gname3,gsubname3,guncertain3)|>
  summarize(g_num=n(),g_per=100*n()/nrow(GTO))|>
  arrange(desc(g_num))|>
  rmarkdown::paged_table()
## `summarise()` has grouped output by 'gname', 'gsubname', 'guncertain1',
## 'gname2', 'gsubname2', 'guncertain2', 'gname3', 'gsubname3'. You can override
## using the `.groups` argument.

claims:

GTO|>group_by(claimed, claimmode_txt, claim2, claimmode2_txt,
              claim3, claimmode3_txt)|>
  summarize(uni_num=n(),uni_per=100*n()/nrow(GTO))|>
  arrange(desc(uni_num))|>
  rmarkdown::paged_table()
## `summarise()` has grouped output by 'claimed', 'claimmode_txt', 'claim2',
## 'claimmode2_txt', 'claim3'. You can override using the `.groups` argument.

Общее число жертв:

sum(GTO$nkill, na.rm=T)
## [1] 411868
sum(GTO$nwound, na.rm=T)
## [1] 523869
sum(GTO$nkillter, na.rm=T)
## [1] 58291
sum(GTO$nwoundte,na.rm=T)
## [1] 12061
sum(GTO$nkillus, na.rm=T)
## [1] 5391
sum(GTO$nwoundus, na.rm=T)
## [1] 4556

nkill:

temp <- GTO|>group_by(nkill)|>
  summarize(uni_num=n(),uni_per=100*n()/nrow(GTO))|>
  arrange(desc(uni_num))

rmarkdown::paged_table(temp)
plot(y=log10(temp$nkill), x=log10(temp$uni_num), type='l', ylab="Kill Count", xlab="Number of Incidents")

nkillus:

GTO|>group_by(nkillus)|>
  summarize(uni_num=n(),uni_per=100*n()/nrow(GTO))|>
  arrange(desc(uni_num))|>
  rmarkdown::paged_table()

nkillter:

GTO|>group_by(nkillter)|>
  summarize(uni_num=n(),uni_per=100*n()/nrow(GTO))|>
  arrange(desc(uni_num))|>
  rmarkdown::paged_table()

nwound:

GTO|>group_by(nwound)|>
  summarize(uni_num=n(),uni_per=100*n()/nrow(GTO))|>
  arrange(desc(uni_num))|>
  rmarkdown::paged_table()

nwoundus:

GTO|>group_by(nwoundus)|>
  summarize(uni_num=n(),uni_per=100*n()/nrow(GTO))|>
  arrange(desc(uni_num))|>
  rmarkdown::paged_table()

nwoundte:

GTO|>group_by(nwoundte)|>
  summarize(uni_num=n(),uni_per=100*n()/nrow(GTO))|>
  arrange(desc(uni_num))|>
  rmarkdown::paged_table()

propertydamage:

GTO|>group_by(property, propextent_txt, propcomment, propvalue)|>
  summarize(uni_num=n(),uni_per=100*n()/nrow(GTO))|>
  arrange(desc(uni_num))|>
  rmarkdown::paged_table()
## `summarise()` has grouped output by 'property', 'propextent_txt',
## 'propcomment'. You can override using the `.groups` argument.

nhostkid:

GTO|>group_by(ishostkid, nhostkid, nhours, ndays)|>
  summarize(uni_num=n(),uni_per=100*n()/nrow(GTO))|>
  arrange(desc(uni_num))|>
  rmarkdown::paged_table()
## `summarise()` has grouped output by 'ishostkid', 'nhostkid', 'nhours'. You can
## override using the `.groups` argument.

divert:

GTO|>group_by(divert, kidhijcountry)|>
  summarize(uni_num=n(),uni_per=100*n()/nrow(GTO))|>
  arrange(desc(uni_num))|>
  rmarkdown::paged_table()
## `summarise()` has grouped output by 'divert'. You can override using the
## `.groups` argument.

international:

GTO|>group_by(INT_LOG, INT_IDEO, INT_MISC)|>
  summarize(uni_num=n(),uni_per=100*n()/nrow(GTO))|>
  arrange(desc(uni_num))|>
  rmarkdown::paged_table()
## `summarise()` has grouped output by 'INT_LOG', 'INT_IDEO'. You can override
## using the `.groups` argument.

ransom:

GTO|>group_by(ransomamt, ransompaid)|>
  summarize(uni_num=n(),uni_per=100*n()/nrow(GTO))|>
  arrange(desc(uni_num))|>
  rmarkdown::paged_table()
## `summarise()` has grouped output by 'ransomamt'. You can override using the
## `.groups` argument.

Про latitude/longitude. Что, если разбить карту мира на квадратики и посчитать число терактов в них?

range_coord <- function(param){
  return(paste(param-param%%10, param-param%%10+10,sep="-"))
}
GTD <- GTO|>
  group_by(latitude, longitude)|>
  mutate(latitude = sapply(latitude, range_coord),
         longitude = sapply(longitude, range_coord))|>
  summarize(block_num=n(),block_per=100*n()/nrow(GTO))|>
  arrange(desc(block_num))
## `summarise()` has grouped output by 'latitude'. You can override using the
## `.groups` argument.
rmarkdown::paged_table(GTD)
GTO1970 <- GTO|>filter(iyear==1970)
map <- leaflet(GTO1970)|>
  addTiles()|>
  addCircleMarkers(popup=GTO1970$summary, label=GTO1970$summary)
## Assuming "longitude" and "latitude" are longitude and latitude, respectively
## Warning in validateCoords(lng, lat, funcName): Data contains 8 rows with either
## missing or invalid lat/lon values and will be ignored
map
leaf <- leaflet() %>%
  addTiles() %>%
  addSimpleGraticule(interval=10)
leaf

specificity/vicinity (Про точность данных):

GTO|>group_by(specificity, vicinity)|>
  summarize(uni_num=n(),uni_per=100*n()/nrow(GTO))|>
  arrange(desc(uni_num))|>
  rmarkdown::paged_table()
## `summarise()` has grouped output by 'specificity'. You can override using the
## `.groups` argument.

Complex Analysis 1:

GTO|>group_by(country_txt, attacktype1_txt)|>
  summarize(uni_num=n(),uni_per=100*n()/nrow(GTO))|>
  arrange(country_txt, desc(uni_num))|>
  rmarkdown::paged_table()
## `summarise()` has grouped output by 'country_txt'. You can override using the
## `.groups` argument.

total bombing/explosion in each country

GTO|>filter(attacktype1_txt=="Bombing/Explosion")|>group_by(country_txt)|>
  summarize(uni_num=n(),uni_per=100*n()/nrow(GTO))|>
  arrange(desc(uni_num))|>
  rmarkdown::paged_table()

attacktype/success:

GTO|>group_by(attacktype1_txt, attacktype2_txt, attacktype3_txt, success)|>
  summarize(succ_num=n(), succ_per=100*n()/nrow(GTO))|>
  arrange(attacktype1_txt,attacktype2_txt,attacktype3_txt,desc(success))|>
  rmarkdown::paged_table()
## `summarise()` has grouped output by 'attacktype1_txt', 'attacktype2_txt',
## 'attacktype3_txt'. You can override using the `.groups` argument.

attacktypes:

GTO|>select(iyear, attacktype1_txt,attacktype2_txt,attacktype3_txt)|>
  gather(key="iyear", value="attacktype", -iyear)|>
  filter(attacktype!="")|>
  count(iyear, attacktype)|>as.data.frame()|>
  rmarkdown::paged_table()

targets

GTO|>select(iyear, target1, target2, target3)|>
  gather(key="iyear", value="target", -iyear)|>
  filter(target!="")|>
  count(iyear, target)|>as.data.frame()|>
  arrange(iyear, desc(n))|>
  rmarkdown::paged_table()

targtype

GTO|>select(iyear, targtype1_txt,targtype2_txt,targtype3_txt)|>
  gather(key="iyear", value="target", -iyear)|>
  filter(target!="")|>
  count(iyear, target)|>as.data.frame()|>
  arrange(iyear, desc(n))|>
  rmarkdown::paged_table()

year/attacktype:

library(ggplot2)
library(gganimate)
library(gapminder)
## Warning: пакет 'gapminder' был собран под R версии 4.2.3
library(gifski)
## Warning: пакет 'gifski' был собран под R версии 4.2.3
GTA <- GTO|>select(iyear, attacktype1_txt,attacktype2_txt,attacktype3_txt)|>
  gather(key="year", value="attacktype", -iyear)|>
  filter(attacktype!="")|>
  count(iyear, attacktype)|>as.data.frame()|>
  rename(num=n)|>
  group_by(iyear)|>
  mutate(rank=min_rank(-num)*1)|>
  filter(rank<=5)|>
  ungroup()

p <- ggplot(GTA, aes(rank, group = attacktype, 
                     fill = as.factor(attacktype), color = as.factor(attacktype))) +
  geom_tile(aes(y = num/2,
                height = num,
                width = 0.9), alpha = 0.8, color = NA) +

  # text in x-axis (requires clip = "off" in coord_*)
  # paste(country, " ")  is a hack to make pretty spacing, since hjust > 1 
  #   leads to weird artifacts in text spacing.
  geom_text(aes(y = 0, label = paste(attacktype, " ")), vjust = 0.2, hjust = 1) +

  coord_flip(clip = "off", expand = FALSE) +
  scale_y_continuous(labels = scales::comma) +
  scale_x_reverse() +
  guides(color = FALSE, fill = FALSE) +

  labs(title='{closest_state}', x = "", y = "Number of Attack Type") +
  theme(plot.title = element_text(hjust = 0, size = 22),
        axis.ticks.y = element_blank(),  # These relate to the axes post-flip
        axis.text.y  = element_blank(),  # These relate to the axes post-flip
        plot.margin = margin(1,1,1,4, "cm")) +

  transition_states(iyear, transition_length = 4, state_length = 1) +
  ease_aes('cubic-in-out')
## Warning: The `<scale>` argument of `guides()` cannot be `FALSE`. Use "none" instead as
## of ggplot2 3.3.4.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
animate(p, 200, fps = 10, duration = 47, width = 1000, height = 800, renderer=gifski_renderer("attacktype.gif"))

Наблюдения по группировкам: число раненых/убитых

GTO|>group_by(gname)|>
  summarize(uni_num_kill=sum(nkill), uni_num_wound=sum(nwound),
            uni_num_kill_ter=sum(nkillter), uni_num_wound_ter=sum(nwoundte))|>
  arrange(desc(uni_num_kill))|>
  rmarkdown::paged_table()

Среднее местоположение терактов группировок. Знание региона разбивает действия группировок

GTO|>group_by(gname, region_txt)|>
  summarize(uni_long=mean(longitude),uni_lat=mean(latitude))|>
  arrange(gname)|>
  rmarkdown::paged_table()
## `summarise()` has grouped output by 'gname'. You can override using the
## `.groups` argument.

Самый распространённый тип атаки у группировок:

GTO|>group_by(gname, attacktype1_txt)|>
  summarize(uni_num=n(),uni_per=100*n()/nrow(GTO))|>
  group_by(gname)|>
  summarize(frequent_method=attacktype1_txt[which.max(uni_num)])|>
  arrange(gname)|>
  rmarkdown::paged_table()
## `summarise()` has grouped output by 'gname'. You can override using the
## `.groups` argument.

Самая распространённая цель у группировок:

GTO|>group_by(gname, target1)|>
  summarize(uni_num=n(),uni_per=100*n()/nrow(GTO))|>
  group_by(gname)|>
  summarize(frequent_target=target1[which.max(uni_num)])|>
  arrange(gname)|>
  rmarkdown::paged_table()
## `summarise()` has grouped output by 'gname'. You can override using the
## `.groups` argument.
GTO|>group_by(gname, target1)|>
  summarize(uni_num=n(),uni_per=100*n()/nrow(GTO))|>
  arrange(desc(uni_num))|>
  rmarkdown::paged_table()
## `summarise()` has grouped output by 'gname'. You can override using the
## `.groups` argument.

Самые разнообразные цели у группировок:

GTO|>group_by(gname, target1, target2, target3)|>
  summarize(uni_num=n(),uni_per=100*n()/nrow(GTO))|>
  group_by(gname)|>
  summarize(target_num=n())|>
  arrange(desc(target_num))|>
  rmarkdown::paged_table()
## `summarise()` has grouped output by 'gname', 'target1', 'target2'. You can
## override using the `.groups` argument.

Сколько убитых/раненых каждым типом атаки:

GTO|>group_by(gname, target1)|>
  summarize(uni_num=n(),uni_per=100*n()/nrow(GTO))|>
  group_by(gname)|>
  summarize(frequent_target=target1[which.max(uni_num)])|>
  arrange(gname)|>
  rmarkdown::paged_table()
## `summarise()` has grouped output by 'gname'. You can override using the
## `.groups` argument.

GIF со странами

GTA <- GTO|>group_by(iyear, country_txt)|>
  summarize(terr_num=n(),terr_per=100*n()/nrow(GTO))|>
  arrange(iyear, desc(terr_num))|>
  rmarkdown::paged_table()
## `summarise()` has grouped output by 'iyear'. You can override using the
## `.groups` argument.
library(ggplot2)
library(gganimate)
library(gapminder)
library(gifski)
theme_set(theme_classic())
GTA <- GTA|>
  group_by(iyear)|>
  mutate(rank = min_rank(-terr_num)*1)|>
  filter(rank<=10)|>
  ungroup()
p <- ggplot(GTA, aes(rank, group = country_txt, 
                     fill = as.factor(country_txt), color = as.factor(country_txt))) +
  geom_tile(aes(y = terr_num/2,
                height = terr_num,
                width = 0.9), alpha = 0.8, color = NA) +

  # text in x-axis (requires clip = "off" in coord_*)
  # paste(country, " ")  is a hack to make pretty spacing, since hjust > 1 
  #   leads to weird artifacts in text spacing.
  geom_text(aes(y = 0, label = paste(country_txt, " ")), vjust = 0.2, hjust = 1) +

  coord_flip(clip = "off", expand = FALSE) +
  scale_y_continuous(labels = scales::comma) +
  scale_x_reverse() +
  guides(color = FALSE, fill = FALSE) +

  labs(title='{closest_state}', x = "", y = "Number of Terrorist Acts") +
  theme(plot.title = element_text(hjust = 0, size = 22),
        axis.ticks.y = element_blank(),  # These relate to the axes post-flip
        axis.text.y  = element_blank(),  # These relate to the axes post-flip
        plot.margin = margin(1,1,1,4, "cm")) +

  transition_states(iyear, transition_length = 4, state_length = 1) +
  ease_aes('cubic-in-out')

animate(p, 200, fps = 10, duration = 47, width = 800, height = 600, renderer=gifski_renderer("terract.gif"))

Число зависимость числа жертв от длительности теракта. Утверждение: чем дольше конфликт, тем больше жертв

GTO|>
  group_by(idate)|>
  mutate(resNum=as.numeric(as.Date(resolution, format="%m/%d/%Y")),
         idateNum=as.numeric(idate))|>
  # mutate(resolution=ifelse(is.na(resolution),0,resolution),
  #        idateNum=ifelse(is.na(idate),0,idateNum))|>
  mutate(duration = ifelse(extended==0,0, resNum-idateNum))|>group_by(duration)|>
  summarize(casualties = mean(nkill, na.rm=T)+mean(nwound, na.rm=T))|>
  arrange(desc(casualties))|>
  rmarkdown::paged_table()